<?php

/**
 * Store_PropertiesController
 *
 * Модуль магазина, контроллер характеристик товаров.
 * Характеристики товаров - это что-то индивидуальное для каждого типа товаров.
 * По этим характеристикам позже можно будет сравнивать товары
 *
 * @package   Store
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com>
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */

class Store_PropertiesController extends Lord_Controller_Action
{

/*------------------------------------------------------------------------------*/

	/**
	 * Индексный метод.
	 * Принимает параметром айдишник категории, и показывает все свойства
	 * в пределах категории, включая свойства дочерних категорий.
	 * Если айдишника нет - будем отображать все характеристики сразу.
	 */

	public function indexAction()
	{
		$properties = $this->model->getProperties();
		$this->view->properties = $properties;
		return;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Добавление свойства товаров
	*/

	public function addAction()
	{
		return $this->_process('add');
	}


/*------------------------------------------------------------------------------*/

	/**
	* Редактирование свойства товаров
	*/

	public function editAction()
	{
		$id = $this->_checkId();

		// получаем данные для заполнения формы
		$data = $this->model->getProperty($id)->toArray();

		// если в $data пусто - нам пытаются скормить что-то не то
		if(empty($data))
			return $this->view->err = 'store_property_edit_fail';

		// достанем нужные категории
		$categoriesData = $this->model->getPropertyCategoriesCross($id)->toArray();
		foreach($categoriesData as $cat)
		{
			$data['categories'][] = $cat['category_id'];
		}


		// и отдаем на редактирование
		return $this->_process('edit', $data);
	}


/*------------------------------------------------------------------------------*/

	/**
	* Удаление категории
	*/

	function deleteAction()
	{
		// проверяем айдишник
		$id = $this->_checkId();

		// отправляем данные в шаблон
		$this->view->property = $this->model->getProperty($id);

		if ($this->_request->isPost())
		{
			// если юзер подтвердил - удаляем
			if ($this->_request->getPost('conf') == 'ok')
			{
				$this->model->delProperty($id);
				$this->model->delPropertyCategoryCross($id);
				$this->model->delPropertyGoodCross($id);
			}
		}
		else
		{
			// если в $this->view->category пусто - нам пытаются скормить левый $id
			if(empty($this->view->property))
				return $this->view->err = 'store_properties_delete_fail';
			else
				return;
		}

		// возвращаемся на главную страницу
		$this->_redirect('store/properties/index');
	}

/*==============================================================================*/

	/**
	* Приватный метод для проверки айдишника записи
	*/

	private function _checkId()
	{
		$id = $this->_getParam('id');

		if( $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return 0;
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для обработки
	* добавления и редактирования
	*
	* @param string $action
	* @param array $data
	* @return void
	*/

	private function _process($action = 'add', $data = array())
	{
		// показываем форму
		$form = $this->_form($data, array(), $action);
		$this->view->form = $form;

		// валидация
		if (!empty($_POST))
		{
			if (!$form->isValid($_POST))
			{
				// показываем сообщение об ошибке
				$this->view->err = 'form_fail';
				// получаем невалидные значения, введенные в форму
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors();
				// показываем форму с невалидными данными
				return $this->view->form = $this->_form($values, $errors, $action);
			}
		}

		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost())
		{
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();

			// кладем в базу и на главную страницу модуля
			// или показываем сообщение о завершении процесса
			if($action == 'add')
			{
				// добавляем само свойство
				$data['name']            = $values['name'];
				$data['active']          = $values['active'];
				$data['show_in_good']    = $values['show_in_good'];
				$data['show_in_compare'] = $values['show_in_compare'];
				$data['show_in_filter']  = $values['show_in_filter'];
				$propertyId = $this->model->addProperty($data);

				// и категории, к которым оно привязано
				foreach($values['categories'] as $categoryId)
				{
					$crossData = array('category_id' => $categoryId,
									   'property_id' => $propertyId);
					$this->model->addPropertyCategoryCross($crossData);
				}

				// сообщение
				return $this->view->msg = 'store_properties_process_add_ok';
			}
			elseif($action == 'edit')
			{
				$id = $this->_checkId();

				// выбираем нужные данные для редактирования
				$updData['name']            = $values['name'];
				$updData['active']          = $values['active'];
				$updData['show_in_good']    = $values['show_in_good'];
				$updData['show_in_compare'] = $values['show_in_compare'];
				$updData['show_in_filter']  = $values['show_in_filter'];
				// обновляем
				$this->model->updateProperty($updData, $id);

				// теперь удалим прежние зависимости
				$this->model->delPropertyCategoryCross($id);

				// и установим новые
				foreach($values['categories'] as $categoryId)
				{
					$crossData = array('category_id' => $categoryId,
									   'property_id' => $id);
					$this->model->addPropertyCategoryCross($crossData);
				}

				//$this->_redirect($this->_moduleName);
				return $this->view->msg = 'store_properties_process_edit_ok';
			}
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для построения формы
	* В качестве аргумента принимает уже заполненые
	* данные (при редактировании)
	*
	* @param $data array
	* @param $errors array
	* @param $action string
	* @param $categories array
	* @return object
	*/

	private function _form($data  = array(),
						  $errors = array(),
						  $action = 'add')
	{
		// обратите внимание, форма создается на основе собственного класса.
		$form = new Lord_Form_Form();
		$form->setAction( '/' . $this->_moduleName .
						  '/' . $this->_controllerName .
						  '/' . $action )
			 ->setMethod('post');

		// кодировка
		$charset = $this->_helper->config()->common->charset;


		// Заголовок
		$name = new Lord_Form_Element_Text('name', array(
			'required'    => true,
			'label'       => $this->view->translate('store_properties_form_name'),
			'description' => $this->view->translate('store_properties_form_name_desc'),
			'maxlength'   => '50',
			'validators'  => array(
				//array('Alnum',        true, array(true)),
				array('StringLength', true, array(0, 50, $charset))
			),
			'value'       => (!empty($data['name'])) ? $data['name'] : ''
		));
		$form->addElement($name);


		// Активность свойства
		$active = new Zend_Form_Element_Radio('active', array(
			'label'       => $this->view->translate('store_properties_form_active'),
			'description' => $this->view->translate('store_properties_form_active_desc'),
			'multiOptions'=> array('1' => $this->view->translate('store_properties_form_active_yes'),
								   '0'=>  $this->view->translate('store_properties_form_active_no'),),
			'validators'  => array(array('InArray', true, array(array('1', '0'), true))),
			'value'       => (!empty($data['active'])) ? $data['active'] : 0 ,
			'required'    => true,
		));
		$active->setSeparator(' ');
		$form->addElement($active);

		// Отображать ли среди характеристик товара
		$showInGood = new Zend_Form_Element_Radio('show_in_good', array(
			'label'       => $this->view->translate('store_properties_form_show_in_good'),
			'description' => $this->view->translate('store_properties_form_show_in_good_desc'),
			'multiOptions'=> array('1' => $this->view->translate('store_properties_form_show_in_good_yes'),
								   '0'=>  $this->view->translate('store_properties_form_show_in_good_no'),),
			'validators'  => array(array('InArray', true, array(array('1', '0'), true))),
			'value'       => (!empty($data['show_in_good'])) ? $data['show_in_good'] : 0 ,
			'required'    => true,
		));
		$showInGood->setSeparator(' ');
		$form->addElement($showInGood);


		// Отображать ли среди в сравнении товаров
		$showInCompare = new Zend_Form_Element_Radio('show_in_compare', array(
			'label'       => $this->view->translate('store_properties_form_show_in_compare'),
			'description' => $this->view->translate('store_properties_form_show_in_compare_desc'),
			'multiOptions'=> array('1' => $this->view->translate('store_properties_form_show_in_compare_yes'),
								   '0'=>  $this->view->translate('store_properties_form_show_in_compare_no'),),
			'validators'  => array(array('InArray', true, array(array('1', '0'), true))),
			'value'       => (!empty($data['show_in_compare'])) ? $data['show_in_compare'] : 0 ,
			'required'    => true,
		));
		$showInCompare->setSeparator(' ');
		$form->addElement($showInCompare);


		// Отображать ли в фильтре товаров при отображении категории
		$showInFilter = new Zend_Form_Element_Radio('show_in_filter', array(
			'label'       => $this->view->translate('store_properties_form_show_in_filter'),
			'description' => $this->view->translate('store_properties_form_show_in_filter_desc'),
			'multiOptions'=> array('1' => $this->view->translate('store_properties_form_show_in_filter_yes'),
								   '0'=>  $this->view->translate('store_properties_form_show_in_filter_no'),),
			'validators'  => array(array('InArray', true, array(array('1', '0'), true))),
			'value'       => (!empty($data['show_in_filter'])) ? $data['show_in_filter'] : 0 ,
			'required'    => true,
		));
		$showInFilter->setSeparator(' ');
		$form->addElement($showInFilter);

		// Категории, которым принадлежит это свойство
		$preCategoriesData = $this->model->getAllCategories();
		foreach($preCategoriesData as $cat)
		{
			$categoriesData[$cat->id] = $cat->name;
		}
		$categories = new Zend_Form_Element_Multiselect('categories', array(
			'required'    => true,
			'multiOptions' => $categoriesData,
			'label'       => $this->view->translate('store_properties_form_categories'),
			'description' => $this->view->translate('store_properties_form_categories_desc'),
			'value'       => (!empty($data['categories'])) ? $data['categories'] : $data = array()
		));
		$form->addElement($categories);


		// айдишник
		$id = $form->createElement('hidden', 'id')
			->setValue($this->_checkId());
		$form->addElement($id);

		// кнопка сабмита
		$form->addElement('submit', 'save',
					array('label' => $this->view->translate('store_properties_form_submit')));

		// ошибки
		$this->_helper->FormErrors($errors, $form);

		return $form;
	}

/*------------------------------------------------------------------------------*/
}
